home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / lang / sofa.lha / sofa / smalleiffel / lib_number / abstract_fraction.e next >
Text File  |  2000-03-25  |  3KB  |  138 lines

  1. -- This file is  free  software, which  comes  along  with  SmallEiffel. This
  2. -- software  is  distributed  in the hope that it will be useful, but WITHOUT 
  3. -- ANY  WARRANTY;  without  even  the  implied warranty of MERCHANTABILITY or
  4. -- FITNESS  FOR A PARTICULAR PURPOSE. You can modify it as you want, provided
  5. -- this header is kept unaltered, and a notification of the changes is added.
  6. -- You  are  allowed  to  redistribute  it and sell it, alone or as a part of 
  7. -- another product.
  8. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  9. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr 
  10. --                       http://SmallEiffel.loria.fr
  11. --
  12. deferred class ABSTRACT_FRACTION 
  13. --
  14. -- To implement NUMBER (do not use this class, see NUMBER).
  15. --
  16.        
  17. inherit NUMBER;
  18.  
  19. feature 
  20.    
  21.    is_zero: BOOLEAN is false;
  22.    
  23.    is_one: BOOLEAN is false;
  24.    
  25.    frozen to_integer: INTEGER is
  26.       do
  27.      check false end;
  28.       end;
  29.    
  30.    infix "@=" (other: INTEGER): BOOLEAN is do end;
  31.    
  32.    infix "//"(other: NUMBER): NUMBER is
  33.       do
  34.      check false end;
  35.       end;
  36.    
  37.    infix "@//"(other: INTEGER): NUMBER is
  38.       do
  39.      check false end;
  40.       end;
  41.    
  42.    infix "\\"(other: NUMBER): NUMBER is
  43.       do
  44.      check false end;
  45.       end;
  46.    
  47.    infix "@\\"(other: INTEGER): NUMBER is
  48.       do
  49.      check false end;
  50.       end;
  51.    
  52. feature {NUMBER}
  53.    
  54.    from_two_integer(n, d: INTEGER): NUMBER is
  55.       local
  56.      num, den, g: INTEGER;
  57.       do
  58.      g := n.abs.gcd(d.abs);
  59.      num := n.abs // g;
  60.      den := d.abs // g;
  61.      if (den = 1) then
  62.         if (n < 0) xor (d < 0) then
  63.            !SMALL_INTEGER!Result.make(-num);
  64.         else
  65.            !SMALL_INTEGER!Result.make(num);
  66.         end;
  67.      else
  68.         if (n < 0) xor (d < 0) then
  69.            !SMALL_FRACTION!Result.make(-num,den);
  70.         else
  71.            !SMALL_FRACTION!Result.make(num,den);
  72.         end;
  73.      end;
  74.       end;
  75.    
  76.    from_two_abstract_integer(n, d: ABSTRACT_INTEGER): NUMBER is
  77.       local
  78.      num, den : ABSTRACT_INTEGER;
  79.      n_abs, g: ABSTRACT_INTEGER;
  80.       do
  81.      n_abs ?= n.abs; 
  82.      g := n_abs.gcd(d.abs);
  83.      if (g @= 1) then
  84.         num := n;
  85.         den := d;
  86.      else
  87.         num ?= n // g;     
  88.         den ?= d // g;
  89.      end;
  90.      if (den.is_one) then
  91.         Result := num;
  92.      else        
  93.         num ?= num.abs;
  94.         den ?= den.abs;
  95.         if num.is_integer and then den.is_integer and then (n.is_negative xor d.is_negative) then
  96.            !SMALL_FRACTION!Result.make(-num.to_integer,den.to_integer);
  97.         elseif (num.is_integer and then den.is_integer) then 
  98.            !SMALL_FRACTION!Result.make(num.to_integer,den.to_integer);
  99.         else
  100.            !LARGE_FRACTION!Result.make_simply(num,den,(n.is_negative xor d.is_negative));
  101.         end;     
  102.      end;
  103.       end;
  104.    
  105.    from_integer_and_abstract_integer(n: INTEGER; d: ABSTRACT_INTEGER): NUMBER is
  106.       require
  107.      d /= Void;
  108.       local
  109.      num: ABSTRACT_INTEGER;
  110.       do
  111.      if (n = Minimum_integer) then
  112.         num := greater_large_negative_integer;
  113.      else
  114.         !SMALL_INTEGER!num.make(n);
  115.      end;
  116.      Result := from_two_abstract_integer(num,d);
  117.       end;   
  118.    
  119.    from_abstract_integer_and_integer(n: ABSTRACT_INTEGER; d: INTEGER): NUMBER is
  120.       require
  121.      n /= Void;
  122.       local
  123.      den: ABSTRACT_INTEGER;
  124.       do
  125.      if (d = Minimum_integer) then
  126.         den := greater_large_negative_integer;
  127.      else
  128.         !SMALL_INTEGER!den.make(d);
  129.      end;
  130.      Result := from_two_abstract_integer(n,den); 
  131.       end;   
  132.    
  133.    
  134. end -- class ABSTRACT_FRACTION
  135.  
  136.  
  137.  
  138.